package org.persistente.manipula.mapeamento;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.persistente.utils.Propriedade;
import java.sql.SQLException;

/**
 * Representa uma relação atributo-campo.
 */
public abstract class CampoAbstrato<T> {


    /**
     * Nome do campo.
     */
    protected String nome;

    public CampoAbstrato(String campo) {
        this.nome = campo;
    }

    public CampoAbstrato<T> novo(String campo){
        try {
            return this.getClass().getConstructor(String.class).newInstance(campo);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    public String getNome() {
        return nome;
    }


    public abstract T get(ResultSet rs) throws SQLException;
    public abstract void set(PreparedStatement ps, int ind, T valor) throws SQLException;
    

    /**
     * Resgata o valor deste atributo de um objeto.
     * @param entidade Objeto que contém o atributo.
     * @return Valor do atributo no objeto.
     */
    public T invocaGet(Object entidade) {
        return (T)Propriedade.invocaGet(entidade, nome);
    }

    /**
     * Altera o valor deste atributo em um objeto.
     * @param entidade Objeto a ter o atributo alterado.
     * @param valor Valor a para o qual o atributo será alterado.
     */
    public void invocaSet(Object entidade, T valor) {
        Propriedade.invocaSet(entidade, nome, valor);
    }
    
    public String toString(T val){
        if(val == null){
            return "";
        }
        return val.toString();
    }
            
}
